# -*- coding: utf-8 -*-
# Gestión gráfica del orden de instanciación de clases.

## vipera, un diseñador de aplicaciones para Python
##     Copyright (C) 2011 Ángel Luis García García
##
##    This program is free software: you can redistribute it and/or modify
##    it under the terms of the GNU General Public License as published by
##    the Free Software Foundation, either version 3 of the License, or
##    (at your option) any later version.
##
##    This program is distributed in the hope that it will be useful,
##    but WITHOUT ANY WARRANTY; without even the implied warranty of
##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##    GNU General Public License for more details.
##
##    You should have received a copy of the GNU General Public License
##    along with this program.  If not, see <http://www.gnu.org/licenses/>.

import wx

from clases_orden_vista import dialogo_orden_clases
from i18n_vipera import t

class dialogo_orden(dialogo_orden_clases):
    '''Diálogo para la gestión gráfica del orden de definición de clases'''
    def __init__(self, parent, lista_clases, idioma = None):
        '''Constructor de clase'''        
        dialogo_orden_clases.__init__(self, parent)
        # Idioma.
        self.l = idioma
        # Cambiamos en widgets generados por wxFB.
        self.SetTitle(t(u'Orden de instanciación de clases', self.l))
        # Creamos columnas.
        self.m_listCtrl_orden.InsertColumn(0, t(u'Especificar el orden de creación de clases', self.l))
        self.m_listCtrl_orden.SetColumnWidth(0, 500)
        # Incluismo lista de clases.
        for i in lista_clases:
            self.m_listCtrl_orden.InsertStringItem(0,unicode(i).strip())
        # Binding.
        self.m_listCtrl_orden.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)

    def OnContextMenu(self, event):
        '''Menú contextual'''
        # Subir un elemento en lo más alto.
        self.id_subir = wx.NewId()
        self.Bind(wx.EVT_MENU, self.OnSubir, id=self.id_subir)
        # Bajar un elemento en lo más bajo.
        self.id_bajar = wx.NewId()
        self.Bind(wx.EVT_MENU, self.OnBajar, id=self.id_bajar)
        # Creamos un menú.
        menu = wx.Menu()
        # Elementos del menú.
        item_subir = wx.MenuItem(menu, self.id_subir,t("Subir", self.l))
        item_bajar = wx.MenuItem(menu, self.id_bajar,t("Bajar", self.l))
        # Añadimos elementos al menú.
        menu.AppendSeparator()
        menu.AppendItem(item_subir)
        menu.AppendItem(item_bajar)
        menu.AppendSeparator()
        # Mostramos el PopMenu.
        self.PopupMenu(menu)
        # Cuando se quita el PopMenu se tiene que limpiar memoria.
        menu.Destroy()

    def __mover_item(self):
        '''Mover elemento'''
        aux = self.m_listCtrl_orden
        # Obtenemos el elemento seleccionado.
        item_sel = aux.GetFirstSelected()
        if item_sel == -1: 
            return None, None
        else: 
            # Guardamos el valor.
            cadena = aux.GetItemText(item_sel)
            # Eliminamos el valor.
            aux.DeleteItem(item_sel)
            # Devolvemos el contenido del elemento.
            return cadena, aux

    def OnSubir(self, event):
        '''Subir clase'''
        # Obtenemos el elemento seleccionado.
        cadena, aux = self.__mover_item()
        if cadena is None: return
        # Insertamos el elemento el primero.
        aux.InsertStringItem(0,cadena)

    def OnBajar(self, event):
        '''Bajar clase'''
        # Obtenemos el elemento seleccionado.
        cadena, aux = self.__mover_item()
        if cadena is None: return
        # Insertamos el elemento el último.
        n = aux.GetItemCount()    
        aux.InsertStringItem(n,cadena)
